package org.gvp.common.http.query;

import lombok.Data;
import org.gvp.common.exception.DateRangeException;


import java.time.LocalDate;
import java.time.YearMonth;

/**
 * 日期范围工具类,该类用于封装日期范围查询条件
 * 此类可以用于查找数据的时候指定日期的范围
 *
 */
@Data
public class DateRange {
    /**
     * 开始日期
     */
    private String startDate;
    /**
     * 结束日期
     */
    private String endDate;
    private DateRange(String startDate, String endDate) {
        this.startDate = startDate;
        this.endDate = endDate;
    }
    /**
     * 根据localDate构建一个日期区间,从第一天到最后一天,当前年份当前月份
     */
    public static DateRange ofLocalDate(LocalDate localDate){
        return ofYearMonth(YearMonth.from(localDate));
    }
    /**
     * 根据月份构建一个指定月份的区间,从第一天到最后一天
     * 构建当前年份的月份区间
     * @exception DateRangeException 如果月份不在1-12之间,则抛出异常
     */
    public static DateRange ofMonth(int month) {
        return ofYearMonth(YearMonth.now().withMonth(month));
    }
    /**
     * 根据指定的年和月构建表示一个月的日期范围
     * @throws DateRangeException 如果年份或者月份不在指定范围内,则抛出异常
     */
    public static DateRange ofYearMonth(int year, int month) {
        if (month < 1 || month > 12) {
            throw new DateRangeException("月份必须在1-12之间") ;
        }
        if (year < 1999 || year > 3000) {
            throw new DateRangeException("年份必须在1999-3000之间") ;
        }
        return ofYearMonth(YearMonth.of(year, month));
    }
    /**
     * 根据指定的年和月构建表示一个月的日期范围
     * @param yearMonth 年月对象
     */
    private static DateRange ofYearMonth(YearMonth yearMonth){
        return new DateRange(yearMonth.atDay(1).toString(), yearMonth.atEndOfMonth().toString());
    }
}
